#include "mips-instr.h"
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

char *code_r_type[] = {
    "add",
    "addu",
    "div",
    "divu",
    "madd",
    "maddu",
    "msub",
    "msubu",
    "mul",
    "mult",
    "multu",
    "seb",
    "seh",
    "slt",
    "sltu",
    "sub",
    "subu",
    "and",
    "nor",
    "or",
    "xor",
    "rotr",
    "rotrv",
    "sllv",
    "srav",
    "srlv"
    "clo",
    "clz",
    "cfc1",
    "ctc1",
    "ehb",
    "ext",
    "ins",
    "jalr",
    "jalr.hb",
    "jalr.r",
    "jalr.r.hb",
    "jr",
    "jr.hb",
    "ldxc1",
    "mfc1",
    "mtc1",
    "mfhc1",
    "mthc1",
    "mfhi",
    "mflo"
    "mthi",
    "mtlo",
    "nop",
    "ssnop",
    "sync",
    "syscall",
    "teq",
    "tge",
    "tgeu",
    "tlbp",
    "tlbr",
    "tlbwi",
    "tlbwr",
    "tlt",
    "tltu",
    "tne",
    "wsbh",
    "break",
    "movf",
    "movn",
    "movz",
    };
char *code_r4_type[] = {
    "sra",
    "sll",
    "srl",
};

char *code_i_type[] = {
    "addi",
    "addiu",
    "sltiu",
    "slti",
    "b",
    "bal",
    "bc1f",
    "bc1fl",
    "bc1t",
    "bc1tl",
    "bc2f",
    "bc2fl",
    "bc2tl",
    "beq",
    "beql",
    "bgez",
    "bgezal",
    "bgezall",
    "bgezl",
    "bgtz",
    "bgtzal",
    "bgtzall",
    "bgtzl",
    "blez",
    "blezl",
    "bltz",
    "bltzal",
    "bltzall",
    "bltzl",
    "bne",
    "bnel",
    "cache",
    "lw",
    "lbu",
    "ldc1",
    "ldc2",
    "lh",
    "lhu",
    "ll",
    "lui",
    "lw",
    "lwl",
    "lwr",
    "ori",
    "pref",
    "sb",
    "sc",
    "sh",
    "sw",
    "swl",
    "swr",
    "synci",
    "teqi",
    "tgei",
    "tgeiu",
    "tlti",
    "tltiu",
    "tnei",
    "xori"

};

char *code_j_type[] = {
    "j",
    "jal",
};

char *code_f_type[] = {
    "abs.s",
    "abs.d",
    "abs.ps",
    "add.s",
    "add.d",
    "add.ps",
    "alnv.ps",
    "c.f.s",
    "c.f.d",
    "c.f.ps",

    "c.un.s",
    "c.un.d",
    "c.un.ps",

    "c.eq.s",
    "c.eq.d",
    "c.eq.ps",

    "c.ueq.s",
    "c.ueq.d",
    "c.ueq.ps",

    "c.olt.s",
    "c.olt.d",
    "c.olt.ps",

    "c.ole.s",
    "c.ole.d",
    "c.ole.ps",

    "c.ule.s",
    "c.ule.d",
    "c.ule.ps",

    "c.sf.s",
    "c.sf.d",
    "c.sf.ps",

    "c.ngle.s",
    "c.ngle.d",
    "c.ngle.ps",

    "c.seq.s",
    "c.seq.d",
    "c.seq.ps",

    "c.ngl.s",
    "c.ngl.d",
    "c.ngl.ps",

    "c.lt.s",
    "c.lt.d",
    "c.lt.ps",

    "c.nge.s",
    "c.nge.d",
    "c.nge.ps",

    "c.le.s",
    "c.le.d",
    "c.le.ps",

    "c.ngt.s",
    "c.ngt.d",
    "c.ngt.ps",

    "ceil.l.s",
    "ceil.l.d",

    "ceil.w.s",
    "ceil.w.d",

    "cvt.d.s",
    "cvt.d.w",
    "cvt.d.l",

    "cvt.l.s",
    "cvt.l.d",

    "cvt.ps.s",
    "cvt.s.pl",
    "cvt.s.pu",

    "cvt.w.s",
    "cvt.w.d",

    "div.s",
    "div.d",

    "floor.l.s",
    "floor.l.d",

    "floor.w.s",
    "floor.w.d",

    "madd.s",
    "madd.d",
    "madd.ps",

    "mov.s",
    "mov.d",
    "mov.ps",

    "movf.s",
    "movf.d",
    "movf.ps",

    "movn.s",
    "movn.d",
    "movn.ps",

    "movz.s",
    "movz.d",
    "movz.ps",

    "msub.s",
    "msub.d",
    "msub.ps",

    "mul.s",
    "mul.d",
    "mul.ps",

    "round.l.s",
    "round.l.d",

    "round.w.s",
    "round.w.d",

    "rsqrt.s",
    "rsqrt.d",

    "sqrt.s",
    "sqrt.d",

    "trunc.l.s",
    "trunc.l.d",

    "trunc.w.s",
    "trunc.w.d",

};


struct mips_instrs mips_instrs = {
    .code_r_type = code_r_type,
    .r_code_size = ARRAY_SIZE(code_r_type),
    .code_r4_type = code_r4_type,
    .r4_code_size = ARRAY_SIZE(code_r4_type),
    .code_i_type = code_i_type,
    .i_code_size = ARRAY_SIZE(code_i_type),
    .code_j_type = code_j_type,
    .j_code_size = ARRAY_SIZE(code_j_type),
    .code_f_type = code_f_type,
    .f_code_size = ARRAY_SIZE(code_f_type),
};
